import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

// 自定义弹窗类，继承自 JDialog
public class CustomDialog extends JDialog {

    public CustomDialog(JFrame parent) {
        // 调用父类构造函数
        // 参数1: 父窗口
        // 参数2: 弹窗是否为模态 (true表示必须先处理弹窗才能操作父窗口)
        super(parent, "这是一个自定义弹窗", true);

        // 设置弹窗的布局
        setLayout(new FlowLayout());

        // 1. 创建一个标签
        JLabel label = new JLabel("这是我自己创建的弹窗！");
        add(label);

        // 2. 创建一个按钮
        JButton closeButton = new JButton("关闭");
        add(closeButton);

        // 3. 为按钮添加点击事件监听器
        closeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 点击按钮时，关闭当前弹窗
                dispose();
            }
        });

        // 设置弹窗的大小和位置
        setSize(300, 150);
        // setLocationRelativeTo(parent); // 相对于父窗口居中
        setLocationRelativeTo(null); // 相对于屏幕居中
        setDefaultCloseOperation(DISPOSE_ON_CLOSE); // 关闭时释放资源
    }

    public static void main(String[] args) {
        // 在事件调度线程 (Event Dispatch Thread) 中创建和显示GUI组件是一个好习惯
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // 创建一个主窗口 (JFrame) 作为父容器
                JFrame frame = new JFrame("主窗口");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 300);
                frame.setVisible(true);

                // 创建并显示自定义弹窗
                CustomDialog dialog = new CustomDialog(frame);
                dialog.setVisible(true); // 显示弹窗，此方法会阻塞，直到弹窗关闭

                System.out.println("自定义弹窗已关闭。");
            }
        });
    }
}
